using System;
using System.Collections.Generic;
using System.Text;
using EntidadesTO;
using System.Data;
using System.Data.SqlClient;

namespace AccesoDatos
{
    public class DeclaracionJuradaDA
    {
        public List<DeclaracionJuradaTO> BuscarDeclaracionFiltro(int pNumJurada, DateTime pFechaDeclaracionIni, DateTime pFechaDeclaracionFin,
                                                            int pCodDocumentoLegal, string pNumDocumento, int pCodEstado,
                                                            int pCodPredio)
        {
            List<DeclaracionJuradaTO> listaDeclaracionJurada = new List<DeclaracionJuradaTO>();
            SqlDataReader reader = null;
            SqlCommand comando;
            ConexionBD instanciaConexion = ConexionBD.ObtenerInstancia();

            try
            {

                instanciaConexion.AbrirConexion();
                comando = new SqlCommand("sp_get_SEC_DeclaracionJurada_filter", instanciaConexion.ObtenerConexion());
                comando.Parameters.AddWithValue("@pNumJurada", pNumJurada);
                
                if (pFechaDeclaracionIni != DateTime.MinValue)
                    comando.Parameters.AddWithValue("@pFechaDeclaracionIni", pFechaDeclaracionIni);
                else
                    comando.Parameters.AddWithValue("@pFechaDeclaracionIni", DBNull.Value);

                if (pFechaDeclaracionFin != DateTime.MinValue)
                    comando.Parameters.AddWithValue("@pFechaDeclaracionFin", pFechaDeclaracionFin);
                else
                    comando.Parameters.AddWithValue("@pFechaDeclaracionFin", DBNull.Value);

                comando.Parameters.AddWithValue("@pCodDocumentoLegal", pCodDocumentoLegal);
                comando.Parameters.AddWithValue("@pNumDocumento", pNumDocumento);
                comando.Parameters.AddWithValue("@pCodEstado", pCodEstado);
                comando.Parameters.AddWithValue("@pCodPredio", pCodPredio);
                comando.CommandType = CommandType.StoredProcedure;

                reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    DeclaracionJuradaTO declaracionJuradaTO = new DeclaracionJuradaTO();
                    declaracionJuradaTO.NumJurada = reader.GetInt32(reader.GetOrdinal("numJurada"));
                    declaracionJuradaTO.NumDocumento = reader.GetString(reader.GetOrdinal("numDocumento"));
                    declaracionJuradaTO.CodDocumento = reader.GetInt32(reader.GetOrdinal("codDocumento"));
                    declaracionJuradaTO.NombreVia = reader.GetString(reader.GetOrdinal("nombreVia"));
                    declaracionJuradaTO.NumVia = reader.GetInt32(reader.GetOrdinal("numVia"));
                    declaracionJuradaTO.SecDistrito = reader.GetInt32(reader.GetOrdinal("secDistrito"));
                    declaracionJuradaTO.FechaDocumSustentatoria = reader.GetDateTime(reader.GetOrdinal("fechaDocumSustentatoria"));
                    declaracionJuradaTO.AnhoAfecto = reader.GetInt32(reader.GetOrdinal("anhoAfecto"));
                    declaracionJuradaTO.TrimestreAfecto = reader.GetInt32(reader.GetOrdinal("codTrimestre"));
                    declaracionJuradaTO.TotalPredioDeclarado = reader.GetDecimal(reader.GetOrdinal("totalPredioDeclarado"));
                    declaracionJuradaTO.CodRegimenDeclarado = reader.GetInt32(reader.GetOrdinal("codRegimenDeclarado"));
                    declaracionJuradaTO.CodMotivoDeclaracion = reader.GetInt32(reader.GetOrdinal("codMotivoDeclaracion"));
                    declaracionJuradaTO.CodTipoZona = reader.GetInt32(reader.GetOrdinal("codTipoZona"));
                    declaracionJuradaTO.CodVia = reader.GetInt32(reader.GetOrdinal("codVia"));
                    declaracionJuradaTO.CodDeclarante = reader.GetInt32(reader.GetOrdinal("codDeclarante"));
                    declaracionJuradaTO.FechaDeclaracion = reader.GetDateTime(reader.GetOrdinal("fechaDeclaracion"));
                    declaracionJuradaTO.DireccionCompleta = reader.GetString(reader.GetOrdinal("direccionCompleta"));
                    declaracionJuradaTO.Motivo = reader.GetString(reader.GetOrdinal("desMotivoDeclaracion"));
                    declaracionJuradaTO.EstadoDeclaracion = reader.GetString(reader.GetOrdinal("desEstadoDeclaracion"));
                    declaracionJuradaTO.CodPersona = reader.GetInt32(reader.GetOrdinal("codPersona"));
                    declaracionJuradaTO.CodEstadoDeclaracion = reader.GetInt32(reader.GetOrdinal("codEstadoDeclaracion"));

                    //Valores que pueden ser nulos
                    if (reader.GetValue(reader.GetOrdinal("interiorVia")) == DBNull.Value)
                        declaracionJuradaTO.InteriorVia = null;
                    else
                        declaracionJuradaTO.InteriorVia = reader.GetString(reader.GetOrdinal("interiorVia"));

                    if (reader.GetValue(reader.GetOrdinal("mzVia")) == DBNull.Value)
                        declaracionJuradaTO.MzVia = null;
                    else
                        declaracionJuradaTO.MzVia = reader.GetString(reader.GetOrdinal("mzVia"));

                    if (reader.GetValue(reader.GetOrdinal("loteVia")) == DBNull.Value)
                        declaracionJuradaTO.LoteVia = null;
                    else
                        declaracionJuradaTO.LoteVia = reader.GetString(reader.GetOrdinal("loteVia"));

                    if (reader.GetValue(reader.GetOrdinal("kmVia")) == DBNull.Value)
                        declaracionJuradaTO.KmVia = -1;
                    else
                        declaracionJuradaTO.KmVia = reader.GetDecimal(reader.GetOrdinal("kmVia"));

                    if (reader.GetValue(reader.GetOrdinal("nombreUrbanizacion")) == DBNull.Value)
                        declaracionJuradaTO.NombreUrbanizacion = null;
                    else
                        declaracionJuradaTO.NombreUrbanizacion = reader.GetString(reader.GetOrdinal("nombreUrbanizacion"));

                    if (reader.GetValue(reader.GetOrdinal("apePatLegal")) == DBNull.Value)
                        declaracionJuradaTO.ApePatLegal = null;
                    else
                        declaracionJuradaTO.ApePatLegal = reader.GetString(reader.GetOrdinal("apePatLegal"));

                    if (reader.GetValue(reader.GetOrdinal("apeMatLegal")) == DBNull.Value)
                        declaracionJuradaTO.ApeMatLegal = null;
                    else
                        declaracionJuradaTO.ApeMatLegal = reader.GetString(reader.GetOrdinal("apeMatLegal"));

                    if (reader.GetValue(reader.GetOrdinal("nombreLegal")) == DBNull.Value)
                        declaracionJuradaTO.NombreLegal = null;
                    else
                        declaracionJuradaTO.NombreLegal = reader.GetString(reader.GetOrdinal("nombreLegal"));

                    if (reader.GetValue(reader.GetOrdinal("numDocumLegal")) == DBNull.Value)
                        declaracionJuradaTO.NumDocumLegal = null;
                    else
                        declaracionJuradaTO.NumDocumLegal = reader.GetString(reader.GetOrdinal("numDocumLegal"));

                    if (reader.GetValue(reader.GetOrdinal("cargoLegal")) == DBNull.Value)
                        declaracionJuradaTO.CargoLegal = null;
                    else
                        declaracionJuradaTO.CargoLegal = reader.GetString(reader.GetOrdinal("cargoLegal"));

                    if (reader.GetValue(reader.GetOrdinal("domicilioFiscalLegal")) == DBNull.Value)
                        declaracionJuradaTO.DomicilioFiscalLegal = null;
                    else
                        declaracionJuradaTO.DomicilioFiscalLegal = reader.GetString(reader.GetOrdinal("domicilioFiscalLegal"));

                    if (reader.GetValue(reader.GetOrdinal("telefonoLegal")) == DBNull.Value)
                        declaracionJuradaTO.TelefonoLegal = null;
                    else
                        declaracionJuradaTO.TelefonoLegal = reader.GetString(reader.GetOrdinal("telefonoLegal"));

                    if (reader.GetValue(reader.GetOrdinal("otrosMotivos")) == DBNull.Value)
                        declaracionJuradaTO.OtrosMotivos = null;
                    else
                        declaracionJuradaTO.OtrosMotivos = reader.GetString(reader.GetOrdinal("otrosMotivos"));

                    if (reader.GetValue(reader.GetOrdinal("observacion")) == DBNull.Value)
                        declaracionJuradaTO.Observacion = null;
                    else
                        declaracionJuradaTO.Observacion = reader.GetString(reader.GetOrdinal("observacion"));

                    if (reader.GetValue(reader.GetOrdinal("codDocumentoLegal")) == DBNull.Value)
                        declaracionJuradaTO.CodDocumentoLegal = -1;
                    else
                        declaracionJuradaTO.CodDocumentoLegal = reader.GetInt32(reader.GetOrdinal("codDocumentoLegal"));


                    listaDeclaracionJurada.Add(declaracionJuradaTO);
                }

                reader.Close();
                instanciaConexion.CerrarConexion();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                listaDeclaracionJurada = null;

            }
            finally
            {
                if (reader != null)
                {
                    if (reader.IsClosed == false)
                        reader.Close();
                }
                if (instanciaConexion.ObtenerConexion().State != ConnectionState.Closed)
                {
                    instanciaConexion.CerrarConexion();
                }
            }

            return listaDeclaracionJurada;

        }

        public int GuardarNuevo(DeclaracionJuradaTO pDeclaracionNueva)
        { 
            SqlParameter ParametroDeclaracionId;
            SqlCommand comando;
            ConexionBD instanciaConexion = ConexionBD.ObtenerInstancia();

            ParametroDeclaracionId = new SqlParameter("@DeclaracionJuradaId", SqlDbType.Int);
            ParametroDeclaracionId.Direction = ParameterDirection.Output;
            
            try
            {
                instanciaConexion.AbrirConexion();
                comando = new SqlCommand("sp_ins_SEC_DeclaracionJurada", instanciaConexion.ObtenerConexion());
                comando.Parameters.AddWithValue("@pNumDocumento", pDeclaracionNueva.NumDocumento);
                comando.Parameters.AddWithValue("@pNombreVia", pDeclaracionNueva.NombreVia);
                comando.Parameters.AddWithValue("@pNumVia", pDeclaracionNueva.NumVia);
                comando.Parameters.AddWithValue("@pInteriorVia", pDeclaracionNueva.InteriorVia);
                comando.Parameters.AddWithValue("@pDptoVia", pDeclaracionNueva.DptoVia);
                comando.Parameters.AddWithValue("@pMzVia", pDeclaracionNueva.MzVia);
                comando.Parameters.AddWithValue("@pLoteVia", pDeclaracionNueva.LoteVia);
                comando.Parameters.AddWithValue("@pKmVia", pDeclaracionNueva.KmVia);
                comando.Parameters.AddWithValue("@pNombreUrbanizacion", pDeclaracionNueva.NombreUrbanizacion);
                comando.Parameters.AddWithValue("@pApePatLegal", pDeclaracionNueva.ApePatLegal);
                comando.Parameters.AddWithValue("@pApeMatLegal", pDeclaracionNueva.ApeMatLegal);
                comando.Parameters.AddWithValue("@pNombreLegal", pDeclaracionNueva.NombreLegal);
                comando.Parameters.AddWithValue("@pNumDocumLegal", pDeclaracionNueva.NumDocumLegal);
                comando.Parameters.AddWithValue("@pCargoLegal", pDeclaracionNueva.CargoLegal);
                comando.Parameters.AddWithValue("@pDomicilioFiscalLegal", pDeclaracionNueva.DomicilioFiscalLegal);
                comando.Parameters.AddWithValue("@pTelefonoLegal", pDeclaracionNueva.TelefonoLegal);
                comando.Parameters.AddWithValue("@pOtrosMotivos", pDeclaracionNueva.OtrosMotivos);
                comando.Parameters.AddWithValue("@pFechaDocumSustentatoria", pDeclaracionNueva.FechaDocumSustentatoria);
                comando.Parameters.AddWithValue("@pCodMotivoDeclaracion", pDeclaracionNueva.CodMotivoDeclaracion);
                comando.Parameters.AddWithValue("@pAnhoAfecto", pDeclaracionNueva.AnhoAfecto);
                comando.Parameters.AddWithValue("@pCodTrimestre", pDeclaracionNueva.TrimestreAfecto);
                comando.Parameters.AddWithValue("@pObservacion", pDeclaracionNueva.Observacion);
                comando.Parameters.AddWithValue("@pTotalPredioDeclarado", pDeclaracionNueva.TotalPredioDeclarado);
                comando.Parameters.AddWithValue("@pCodDocumento", pDeclaracionNueva.CodDocumento);
                comando.Parameters.AddWithValue("@pCodRegimenDeclarado", pDeclaracionNueva.CodRegimenDeclarado);
                comando.Parameters.AddWithValue("@pSecDistrito", pDeclaracionNueva.SecDistrito);
                comando.Parameters.AddWithValue("@pCodTipoZona", pDeclaracionNueva.CodTipoZona);
                comando.Parameters.AddWithValue("@pCodEstadoDeclaracion", pDeclaracionNueva.CodEstadoDeclaracion);
                comando.Parameters.AddWithValue("@pCodVia", pDeclaracionNueva.CodVia);
                comando.Parameters.AddWithValue("@pCodDeclarante", pDeclaracionNueva.CodDeclarante);
                comando.Parameters.AddWithValue("@pCodPersona", pDeclaracionNueva.CodPersona);
                comando.Parameters.AddWithValue("@pCodDocumentoLegal", pDeclaracionNueva.CodDocumentoLegal);
                comando.Parameters.AddWithValue("@pFechaDeclaracion", pDeclaracionNueva.FechaDeclaracion);

                comando.CommandType = CommandType.StoredProcedure;

                ParametroDeclaracionId = new SqlParameter("@DeclaracionJuradaId", SqlDbType.Int);
                ParametroDeclaracionId.Direction = ParameterDirection.Output;

                comando.Parameters.Add(ParametroDeclaracionId);
                comando.ExecuteNonQuery();
                
                instanciaConexion.CerrarConexion();
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                if (instanciaConexion.ObtenerConexion().State != ConnectionState.Closed)
                {
                    instanciaConexion.CerrarConexion();
                }
            }
            return Int32.Parse(ParametroDeclaracionId.Value.ToString());
        }


        public void Modificar(DeclaracionJuradaTO pDeclaracionModificar)
        {
            SqlCommand comando;
            ConexionBD instanciaConexion = ConexionBD.ObtenerInstancia();

            try
            {
                instanciaConexion.AbrirConexion();
                comando = new SqlCommand("sp_upd_SEC_DeclaracionJurada", instanciaConexion.ObtenerConexion());
                comando.Parameters.AddWithValue("@pNumJurada", pDeclaracionModificar.NumJurada);
                comando.Parameters.AddWithValue("@pNumDocumento", pDeclaracionModificar.NumDocumento);
                comando.Parameters.AddWithValue("@pNombreVia", pDeclaracionModificar.NombreVia);
                comando.Parameters.AddWithValue("@pNumVia", pDeclaracionModificar.NumVia);
                comando.Parameters.AddWithValue("@pInteriorVia", pDeclaracionModificar.InteriorVia);
                comando.Parameters.AddWithValue("@pDptoVia", pDeclaracionModificar.DptoVia);
                comando.Parameters.AddWithValue("@pMzVia", pDeclaracionModificar.MzVia);
                comando.Parameters.AddWithValue("@pLoteVia", pDeclaracionModificar.LoteVia);
                comando.Parameters.AddWithValue("@pKmVia", pDeclaracionModificar.KmVia);
                comando.Parameters.AddWithValue("@pNombreUrbanizacion", pDeclaracionModificar.NombreUrbanizacion);
                comando.Parameters.AddWithValue("@pApePatLegal", pDeclaracionModificar.ApePatLegal);
                comando.Parameters.AddWithValue("@pApeMatLegal", pDeclaracionModificar.ApeMatLegal);
                comando.Parameters.AddWithValue("@pNombreLegal", pDeclaracionModificar.NombreLegal);
                comando.Parameters.AddWithValue("@pNumDocumLegal", pDeclaracionModificar.NumDocumLegal);
                comando.Parameters.AddWithValue("@pCargoLegal", pDeclaracionModificar.CargoLegal);
                comando.Parameters.AddWithValue("@pDomicilioFiscalLegal", pDeclaracionModificar.DomicilioFiscalLegal);
                comando.Parameters.AddWithValue("@pTelefonoLegal", pDeclaracionModificar.TelefonoLegal);
                comando.Parameters.AddWithValue("@pOtrosMotivos", pDeclaracionModificar.OtrosMotivos);
                comando.Parameters.AddWithValue("@pFechaDocumSustentatoria", pDeclaracionModificar.FechaDocumSustentatoria);
                comando.Parameters.AddWithValue("@pCodMotivoDeclaracion", pDeclaracionModificar.CodMotivoDeclaracion);
                comando.Parameters.AddWithValue("@pAnhoAfecto", pDeclaracionModificar.AnhoAfecto);
                comando.Parameters.AddWithValue("@pCodTrimestre", pDeclaracionModificar.TrimestreAfecto);
                comando.Parameters.AddWithValue("@pObservacion", pDeclaracionModificar.Observacion);
                comando.Parameters.AddWithValue("@pTotalPredioDeclarado", pDeclaracionModificar.TotalPredioDeclarado);
                comando.Parameters.AddWithValue("@pCodDocumento", pDeclaracionModificar.CodDocumento);
                comando.Parameters.AddWithValue("@pCodRegimenDeclarado", pDeclaracionModificar.CodRegimenDeclarado);
                comando.Parameters.AddWithValue("@pSecDistrito", pDeclaracionModificar.SecDistrito);
                comando.Parameters.AddWithValue("@pCodTipoZona", pDeclaracionModificar.CodTipoZona);
                comando.Parameters.AddWithValue("@pCodEstadoDeclaracion", pDeclaracionModificar.CodEstadoDeclaracion);
                comando.Parameters.AddWithValue("@pCodVia", pDeclaracionModificar.CodVia);
                comando.Parameters.AddWithValue("@pCodDeclarante", pDeclaracionModificar.CodDeclarante);
                comando.Parameters.AddWithValue("@pCodPersona", pDeclaracionModificar.CodPersona);
                comando.Parameters.AddWithValue("@pCodDocumentoLegal", pDeclaracionModificar.CodDocumentoLegal);
                comando.Parameters.AddWithValue("@pFechaDeclaracion", pDeclaracionModificar.FechaDeclaracion);

                comando.CommandType = CommandType.StoredProcedure;
                comando.ExecuteNonQuery();

                instanciaConexion.CerrarConexion();
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                if (instanciaConexion.ObtenerConexion().State != ConnectionState.Closed)
                {
                    instanciaConexion.CerrarConexion();
                }
            }
        }

        public void Eliminar(DeclaracionJuradaTO pDeclaracionEliminar)
        {
            SqlCommand comando;
            ConexionBD instanciaConexion = ConexionBD.ObtenerInstancia();

            try
            {
                instanciaConexion.AbrirConexion();
                comando = new SqlCommand("sp_del_SEC_DeclaracionJurada", instanciaConexion.ObtenerConexion());
                comando.Parameters.AddWithValue("@pNumJurada", pDeclaracionEliminar.NumJurada);
            
                comando.CommandType = CommandType.StoredProcedure;
                comando.ExecuteNonQuery();

                instanciaConexion.CerrarConexion();
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                if (instanciaConexion.ObtenerConexion().State != ConnectionState.Closed)
                {
                    instanciaConexion.CerrarConexion();
                }
            }
        }

        public void ActualizarEstado(int pNumJurada, int pCodEstadoDeclaracion)
        {
            SqlCommand comando;
            ConexionBD instanciaConexion = ConexionBD.ObtenerInstancia();

            try
            {
                instanciaConexion.AbrirConexion();
                comando = new SqlCommand("sp_upd_SEC_DeclaracionJurada_estado", instanciaConexion.ObtenerConexion());
                comando.Parameters.AddWithValue("@pNumJurada", pNumJurada);
                comando.Parameters.AddWithValue("@pCodEstadoDeclaracion", pCodEstadoDeclaracion);

                comando.CommandType = CommandType.StoredProcedure;
                comando.ExecuteNonQuery();

                instanciaConexion.CerrarConexion();
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                if (instanciaConexion.ObtenerConexion().State != ConnectionState.Closed)
                {
                    instanciaConexion.CerrarConexion();
                }
            }
        }


    }
}
